home *** CD-ROM | disk | FTP | other *** search
/ Tech Arsenal 1 / Tech Arsenal (Arsenal Computer).ISO / tek-19 / iritsm3s.zip / SBZREVAL.C < prev    next >
C/C++ Source or Header  |  1991-05-18  |  4KB  |  138 lines

  1. /******************************************************************************
  2. * SBzrEval.c - Bezier surfaces handling routines - evaluation routines.          *
  3. *******************************************************************************
  4. * Written by Gershon Elber, Mar. 90.                          *
  5. ******************************************************************************/
  6.  
  7. #include "cagd_loc.h"
  8.  
  9. /******************************************************************************
  10. * Evaluate the given tensor product Bezier surface at a given point, by       *
  11. * extracting an isoparamteric curve along u and evaluating v in it.          *
  12. *                                          *
  13. *        u -->                                  *
  14. *     +----------------------+                              *
  15. *     |P0         Pi-1|                              *
  16. *   V |Pi        P2i-1|    Parametric space orientation - control mesh.  *
  17. *    ||                 |                              *
  18. *    v|Pn-i         Pn-1|                              *
  19. *     +----------------------+                              *
  20. *                                          *
  21. ******************************************************************************/
  22. CagdRType *BzrSrfEvalAtParam(CagdSrfStruct *Srf, CagdRType u, CagdRType v)
  23. {
  24.     CagdRType *Pt;
  25.     CagdCrvStruct
  26.     *IsoCrv = BzrSrfCrvFromSrf(Srf, u, CAGD_CONST_U_DIR);
  27.  
  28.     Pt = BzrCrvEvalAtParam(IsoCrv, v);
  29.  
  30.     CagdCrvFree(IsoCrv);
  31.  
  32.     return Pt;
  33. }
  34.  
  35. /******************************************************************************
  36. * Extract an isoline curve out of the given tensor product Bezier surface.    *
  37. * Operations should prefer the CONST_U_DIR, in which the extraction is          *
  38. * somewhat faster if it is possible.                          *
  39. ******************************************************************************/
  40. CagdCrvStruct *BzrSrfCrvFromSrf(CagdSrfStruct *Srf, CagdRType t,
  41.                             CagdSrfDirType Dir)
  42. {
  43.     CagdCrvStruct *Crv;
  44.     CagdBType
  45.     IsNotRational = !CAGD_IS_RATIONAL_SRF(Srf);
  46.     int i, j, CrvOrder, VecLen,
  47.     MaxCoord = CAGD_NUM_OF_PT_COORD(Srf -> PType);
  48.     CagdRType *CrvP, *SrfP;
  49.  
  50.     switch (Dir) {
  51.     case CAGD_CONST_U_DIR:
  52.         Crv = BzrCrvNew(CrvOrder = Srf -> VLength, Srf -> PType);
  53.         VecLen = Srf -> ULength;
  54.  
  55.         for (i = IsNotRational; i <= MaxCoord; i++) {
  56.         CrvP = Crv -> Points[i];
  57.         SrfP = Srf -> Points[i];
  58.         for (j = 0; j < CrvOrder; j++) {
  59.             *CrvP++ = BzrCrvEvalVecAtParam(SrfP, CAGD_NEXT_U(Srf),
  60.                                 VecLen, t);
  61.             SrfP += CAGD_NEXT_V(Srf);
  62.         }
  63.         }
  64.         break;
  65.     case CAGD_CONST_V_DIR:
  66.         Crv = BzrCrvNew(CrvOrder = Srf -> ULength, Srf -> PType);
  67.         VecLen = Srf -> VLength;
  68.  
  69.         for (i = IsNotRational; i <= MaxCoord; i++) {
  70.         CrvP = Crv -> Points[i];
  71.         SrfP = Srf -> Points[i];
  72.         for (j = 0; j < CrvOrder; j++) {
  73.             *CrvP++ = BzrCrvEvalVecAtParam(SrfP, CAGD_NEXT_V(Srf),
  74.                                 VecLen, t);
  75.             SrfP += CAGD_NEXT_U(Srf);
  76.         }
  77.         }
  78.         break;
  79.     default:
  80.         FATAL_ERROR(CAGD_ERR_DIR_NOT_CONST_UV);
  81.         break;
  82.     }
  83.     return Crv;
  84. }
  85.  
  86. /******************************************************************************
  87. * Extract an isoline curve out of the given mesh row/col.              *
  88. * The provided (zero based) Index specifies which row/col Index to extract.   *
  89. ******************************************************************************/
  90. CagdCrvStruct *BzrSrfCrvFromMesh(CagdSrfStruct *Srf, int Index,
  91.                             CagdSrfDirType Dir)
  92. {
  93.     CagdCrvStruct *Crv;
  94.     CagdBType
  95.     IsNotRational = !CAGD_IS_RATIONAL_SRF(Srf);
  96.     int i, j, CrvOrder,
  97.     MaxCoord = CAGD_NUM_OF_PT_COORD(Srf -> PType);
  98.     CagdRType *CrvP, *SrfP;
  99.  
  100.     switch (Dir) {
  101.     case CAGD_CONST_U_DIR:
  102.         if (Index + 1 > Srf -> ULength)
  103.         FATAL_ERROR(CAGD_ERR_INDEX_NOT_IN_MESH);
  104.  
  105.         Crv = BzrCrvNew(CrvOrder = Srf -> VLength, Srf -> PType);
  106.  
  107.         for (i = IsNotRational; i <= MaxCoord; i++) {
  108.         CrvP = Crv -> Points[i];
  109.         SrfP = Srf -> Points[i] + Index * CAGD_NEXT_U(Srf);
  110.         for (j = 0; j < CrvOrder; j++) {
  111.             *CrvP++ = *SrfP;
  112.             SrfP += CAGD_NEXT_V(Srf);
  113.         }
  114.         }
  115.         break;
  116.     case CAGD_CONST_V_DIR:
  117.         if (Index + 1 > Srf -> VLength)
  118.         FATAL_ERROR(CAGD_ERR_INDEX_NOT_IN_MESH);
  119.  
  120.         Crv = BzrCrvNew(CrvOrder = Srf -> ULength, Srf -> PType);
  121.  
  122.         for (i = IsNotRational; i <= MaxCoord; i++) {
  123.         CrvP = Crv -> Points[i];
  124.         SrfP = Srf -> Points[i] + Index * CAGD_NEXT_V(Srf);;
  125.         for (j = 0; j < CrvOrder; j++) {
  126.             *CrvP++ = *SrfP;
  127.             SrfP += CAGD_NEXT_U(Srf);
  128.         }
  129.         }
  130.         break;
  131.     default:
  132.         FATAL_ERROR(CAGD_ERR_DIR_NOT_CONST_UV);
  133.         break;
  134.     }
  135.     return Crv;
  136. }
  137.  
  138.